package day1_array.leetcode.sliding_window;

/**
 * @Author: yuisama
 * @Date: 2022/9/8 14:15
 * @Description:滑动窗口套路解决最长不重复子串问题
 */
public class Num3_LengthOfSubStr {
    public int lengthOfLongestSubstring(String s) {
        int left = 0,right = 0;
        // windows[left..right) 为无重复子串
        char[] windows = new char[256];
        // 不重复子串长度
        int res = 0;
        while (right < s.length()) {
            char c = s.charAt(right);
            right ++;
            // 更新窗口
            windows[c] ++;
            // 判断是否需要缩短左窗口
            // 当widows[c] > 1，说明右窗口扫描到了重复字符，需要将左窗口一直修改
            while (windows[c] > 1) {
                char d = s.charAt(left);
                left ++;
                // 更新窗口
                windows[d] --;
            }
            // 走到这里，windows[left..right)一定是不重复的字符窗口，计算子串的长度
            res = Math.max(res,right - left);
        }
        return res;
    }
}
